Research Purpose

我們計畫透過Youbike的使用資料,來研究這樣的喝咖啡政策是不是真的有顯著效果,以及分析台北市各個區域間單車騎乘率,研究咖啡站的選址是否合乎效率。

政策背景: 北市府為提倡節能減炭,訂定每周五為綠色運輸日,只要周五騎自行車通勤上班就請你喝咖啡,每周五上午7時30分至9時30分擺設攤位由原六個增加為12個,供騎單車市民領取咖啡點心,共同響應周五綠色運輸日,我們希望檢視此活動是否真的能使綠色運輸日當天使用自行車通勤數量增加。

Note:這份notebook主要先透過探索政府即時公開資料,試圖觀察Youbike使用變化,所以尚未涉及回歸模型。

Using Library

library(jsonlite)
library(httr)
library(gplots)
require(ggplot2)
library(readr)
library(plm)
library(stringr)
library(readr)
library(data.table)

Data:Ubike

Import data

RAW <- read_csv("~/Google Drive/Course/Working_on/內生性報告/ubike/ubikedf2.csv")
ubike.df <- RAW
ubike.df$"X1"<-NULL

Cleaning data

重新命名

url <- "http://data.taipei/youbike"
ubike.list <- fromJSON(content(GET(url),"text"))
cname <- names(ubike.list$retVal$`0001`)
names(ubike.df) <- c(cname,"Time")

Drop NA

ubike.df<-ubike.df[!is.na(ubike.df$sbi),]

Add time

ubike.df["sat"]<-ubike.df$sbi/ubike.df$tot
ubike.df$"sno"<-as.factor(ubike.df$"sno")
ubike.df$Time<-as.POSIXct(ubike.df$Time)
ubike.df["hour"]<-format(ubike.df$Time,"%H")
ubike.df["date"]<-format(ubike.df$Time,"%d")
ubike.df["min"]<-format(ubike.df$Time,"%M")
Sys.setlocale("LC_TIME", "en_US")
ubike.df["dow"]<-weekdays(ubike.df$Time)
ubike.df$hour<-as.numeric(ubike.df$hour)
ubike.df$date<-as.numeric(ubike.df$date)

Add position

ubike.df["position"]<-paste (ubike.df$lat,ubike.df$lng,sep = ",", collapse = NULL)

咖啡站點

coffeStand<-sort(c(173,175,8,45,87,22,115,57,134,238,172,187))
ubike.df$"coffee"=ifelse(ubike.df$sno %in% coffeStand,1,0)

氣象測站配對

ubike.df["station"]<-"tpe"
ubike.df$"station"[ubike.df$sareaen=="Xinyi Dist."]<-"xyi"
ubike.df$"station"[ubike.df$sareaen=="Nangang Dist."]<-"nag"
ubike.df$"station"[ubike.df$sareaen=="Zhongzheng Dist."]<-"tpe"
ubike.df$"station"[ubike.df$sareaen=="Wanhua Dist."]<-"tpe"
ubike.df$"station"[ubike.df$sareaen=="Wenshan Dist."]<-"wen"
ubike.df$"station"[ubike.df$sareaen=="Daan Dist."]<-"xyi"
ubike.df$"station"[ubike.df$sareaen=="Shilin Dist."]<-"tia"
ubike.df$"station"[ubike.df$sareaen=="Beitou Dist."]<-"tia"
ubike.df$"station"[ubike.df$sareaen=="Songshan Dist."]<-"ssh"
ubike.df

Check plot

using plotmean

plotmeans(sat ~ sareaen, main="Heterogeineity across area", data=ubike.df)

plotmeans(sat ~ sno, main="Heterogeineity across sno", data=ubike.df)

Drop out row value==0

#drop 6,82,139,252
ubike.df<-ubike.df[!ubike.df$sno %in% c(6,82,139,252),]

review plotmeans

plotmeans(sat ~ sno, main="Heterogeineity across no.", data=ubike.df)

plotmeans(sat ~ sareaen, main="Heterogeineity across area", data=ubike.df)

plotmeans(sat ~ dow, main="Heterogeineity across day of week", data=ubike.df)

Check specific bike station

station no.1

sta1<-ubike.df[ubike.df$sno==1,]
plot(sta1$Time,sta1$sat)

highlight Friday

highlight morning

station no.1:A closer look

highlight Friday

highlight morning

station no.22

sta1<-ubike.df[ubike.df$sno==22,]
plot(sta1$Time,sta1$sat)

Data:Weather

讀入天氣資訊

station<-c("taipei","tianmu","neihu","xinyi","songshan","gongguan","dazhi","wenshan","nangang")
k=0
for(i in 1:length(station))
{
  wheaWD<-"/Users/maxchen/Google Drive/Course/Working_on/內生性報告/weather/"
  wheaWD<-paste(wheaWD,station[i],sep = "", collapse = NULL)
  setwd(wheaWD)
  files = list.files(pattern="*.csv")
  temp = do.call(rbind, lapply(files,function(x){
    read.csv(x,fileEncoding = "UTF-8", stringsAsFactors = FALSE)
  }))
  if(k==0)
  {
    weather<-temp
    k=1
  }
  else
  {
    weather<-rbind(weather,temp)
  }
}

重新命名

colnames(weather) <-c("Obstime","StnPre","SeaPre","temp_hour","Tddewpoint","humidity","wind_speed", "wind_degree","WSGust","WDGust", "precp","precpHour","sunshine","Globrad","visb","year","month","day","hour","Time","station")
weather$X<-NULL
weather$temp_hour<-as.numeric(weather$temp_hour)
weather$humidity<-as.numeric(weather$humidity)
weather$wind_speed<-as.numeric(weather$wind_speed)
weather$precp<-as.numeric(weather$precp)

合併天氣資料

colnames(ubike.df)[18] <- "day"
total <- merge(ubike.df,weather, by = c("day","hour","station") , all.x=TRUE )

標示下雨

total["rain"]<-0
total$rain[total$precp>0]<-1
colnames(total)[18] <- "Time"
total
sta1<-total[total$sno==22,]

加入下雨區間

Difference

Check station no.1

sta1<-total[total$sno==1,]

Sort by time

sta1<-sta1[order(sta1$Time , decreasing = FALSE ),]

Calculate difference

sta1$"diff"<-0
for(i in 2:nrow(sta1))
{
  sta1$diff[i]<-abs(sta1$sbi[i]-sta1$sbi[i-1])
}

Check plot

Check station no.22

Check station no.87 大安

Check station no.45 公館

LS0tCnRpdGxlOiAiWW91YmlrZeeglOeptjrlhafnlJ/mgKfntpPmv5/liIbmnpDloLHlkYoiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQojUmVzZWFyY2ggUHVycG9zZQrmiJHlgJHoqIjnlavpgI/pgY5Zb3ViaWtl55qE5L2/55So6LOH5paZ77yM5L6G56CU56m26YCZ5qij55qE5Zad5ZKW5ZWh5pS/562W5piv5LiN5piv55yf55qE5pyJ6aGv6JGX5pWI5p6c77yM5Lul5Y+K5YiG5p6Q5Y+w5YyX5biC5ZCE5YCL5Y2A5Z+f6ZaT5Zau6LuK6aiO5LmY546H77yM56CU56m25ZKW5ZWh56uZ55qE6YG45Z2A5piv5ZCm5ZCI5LmO5pWI546H44CCCgrmlL/nrZbog4zmma/vvJoK5YyX5biC5bqc54K65o+Q5YCh56+A6IO95rib54Kt77yM6KiC5a6a5q+P5ZGo5LqU54K657ag6Imy6YGL6Ly45pel77yM5Y+q6KaB5ZGo5LqU6aiO6Ieq6KGM6LuK6YCa5Yuk5LiK54+t5bCx6KuL5L2g5Zad5ZKW5ZWh77yMYGBg5q+P5ZGo5LqU5LiK5Y2IN+aZgjMw5YiG6IezOeaZgjMw5YiGYGBg5pO66Kit5pSk5L2N55Sx5Y6f5YWt5YCL5aKe5Yqg54K6MTLlgIvvvIzkvpvpqI7llq7ou4rluILmsJHpoJjlj5blkpbllaHpu57lv4PvvIzlhbHlkIzpn7/mh4nlkajkupTntqDoibLpgYvovLjml6XvvIzmiJHlgJHluIzmnJvmqqLoppbmraTmtLvli5XmmK/lkKbnnJ/nmoTog73kvb/ntqDoibLpgYvovLjml6XnlbblpKnkvb/nlKjoh6rooYzou4rpgJrli6Tmlbjph4/lop7liqDjgIIKCgpOb3RlOumAmeS7vW5vdGVib29r5Li76KaB5YWI6YCP6YGO5o6i57Si5pS/5bqc5Y2z5pmC5YWs6ZaL6LOH5paZ77yM6Kmm5ZyW6KeA5a+fWW91YmlrZeS9v+eUqOiuiuWMlu+8jOaJgOS7peWwmuacqua2ieWPiuWbnuatuOaooeWei+OAggoKCgoKI1VzaW5nIExpYnJhcnkKYGBge3IgbWVzc2FnZT1GQUxTRX0KbGlicmFyeShqc29ubGl0ZSkKbGlicmFyeShodHRyKQpsaWJyYXJ5KGdwbG90cykKcmVxdWlyZShnZ3Bsb3QyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHBsbSkKbGlicmFyeShzdHJpbmdyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KGRhdGEudGFibGUpCgpgYGAKIyBEYXRhOlViaWtlCiMjSW1wb3J0IGRhdGEKYGBge3IgcmVzdWx0cyA9ICJoaWRlIn0KUkFXIDwtIHJlYWRfY3N2KCJ+L0dvb2dsZSBEcml2ZS9Db3Vyc2UvV29ya2luZ19vbi/lhafnlJ/mgKfloLHlkYovdWJpa2UvdWJpa2VkZjIuY3N2IikKdWJpa2UuZGYgPC0gUkFXCnViaWtlLmRmJCJYMSI8LU5VTEwKYGBgCiMjQ2xlYW5pbmcgZGF0YQoKIyMj6YeN5paw5ZG95ZCNCmBgYHtyIG1lc3NhZ2U9RkFMU0V9CnVybCA8LSAiaHR0cDovL2RhdGEudGFpcGVpL3lvdWJpa2UiCnViaWtlLmxpc3QgPC0gZnJvbUpTT04oY29udGVudChHRVQodXJsKSwidGV4dCIpKQpjbmFtZSA8LSBuYW1lcyh1YmlrZS5saXN0JHJldFZhbCRgMDAwMWApCm5hbWVzKHViaWtlLmRmKSA8LSBjKGNuYW1lLCJUaW1lIikKYGBgCiMjI0Ryb3AgTkEKYGBge3J9CnViaWtlLmRmPC11YmlrZS5kZlshaXMubmEodWJpa2UuZGYkc2JpKSxdCmBgYAoKIyMjQWRkIHRpbWUKYGBge3IgbWVzc2FnZT1GQUxTRSxyZXN1bHRzID0gImhpZGUifQp1YmlrZS5kZlsic2F0Il08LXViaWtlLmRmJHNiaS91YmlrZS5kZiR0b3QKdWJpa2UuZGYkInNubyI8LWFzLmZhY3Rvcih1YmlrZS5kZiQic25vIikKdWJpa2UuZGYkVGltZTwtYXMuUE9TSVhjdCh1YmlrZS5kZiRUaW1lKQp1YmlrZS5kZlsiaG91ciJdPC1mb3JtYXQodWJpa2UuZGYkVGltZSwiJUgiKQp1YmlrZS5kZlsiZGF0ZSJdPC1mb3JtYXQodWJpa2UuZGYkVGltZSwiJWQiKQp1YmlrZS5kZlsibWluIl08LWZvcm1hdCh1YmlrZS5kZiRUaW1lLCIlTSIpClN5cy5zZXRsb2NhbGUoIkxDX1RJTUUiLCAiZW5fVVMiKQp1YmlrZS5kZlsiZG93Il08LXdlZWtkYXlzKHViaWtlLmRmJFRpbWUpCnViaWtlLmRmJGhvdXI8LWFzLm51bWVyaWModWJpa2UuZGYkaG91cikKdWJpa2UuZGYkZGF0ZTwtYXMubnVtZXJpYyh1YmlrZS5kZiRkYXRlKQpgYGAKCiMjI0FkZCBwb3NpdGlvbgpgYGB7cn0KdWJpa2UuZGZbInBvc2l0aW9uIl08LXBhc3RlICh1YmlrZS5kZiRsYXQsdWJpa2UuZGYkbG5nLHNlcCA9ICIsIiwgY29sbGFwc2UgPSBOVUxMKQpgYGAKCiMjI+WSluWVoeermem7ngpgYGB7ciBtZXNzYWdlPUZBTFNFfQpjb2ZmZVN0YW5kPC1zb3J0KGMoMTczLDE3NSw4LDQ1LDg3LDIyLDExNSw1NywxMzQsMjM4LDE3MiwxODcpKQp1YmlrZS5kZiQiY29mZmVlIj1pZmVsc2UodWJpa2UuZGYkc25vICVpbiUgY29mZmVTdGFuZCwxLDApCmBgYAoKIyMj5rCj6LGh5ris56uZ6YWN5bCNCmBgYHtyfQp1YmlrZS5kZlsic3RhdGlvbiJdPC0idHBlIgp1YmlrZS5kZiQic3RhdGlvbiJbdWJpa2UuZGYkc2FyZWFlbj09IlhpbnlpIERpc3QuIl08LSJ4eWkiCnViaWtlLmRmJCJzdGF0aW9uIlt1YmlrZS5kZiRzYXJlYWVuPT0iTmFuZ2FuZyBEaXN0LiJdPC0ibmFnIgp1YmlrZS5kZiQic3RhdGlvbiJbdWJpa2UuZGYkc2FyZWFlbj09Ilpob25nemhlbmcgRGlzdC4iXTwtInRwZSIKdWJpa2UuZGYkInN0YXRpb24iW3ViaWtlLmRmJHNhcmVhZW49PSJXYW5odWEgRGlzdC4iXTwtInRwZSIKdWJpa2UuZGYkInN0YXRpb24iW3ViaWtlLmRmJHNhcmVhZW49PSJXZW5zaGFuIERpc3QuIl08LSJ3ZW4iCnViaWtlLmRmJCJzdGF0aW9uIlt1YmlrZS5kZiRzYXJlYWVuPT0iRGFhbiBEaXN0LiJdPC0ieHlpIgp1YmlrZS5kZiQic3RhdGlvbiJbdWJpa2UuZGYkc2FyZWFlbj09IlNoaWxpbiBEaXN0LiJdPC0idGlhIgp1YmlrZS5kZiQic3RhdGlvbiJbdWJpa2UuZGYkc2FyZWFlbj09IkJlaXRvdSBEaXN0LiJdPC0idGlhIgp1YmlrZS5kZiQic3RhdGlvbiJbdWJpa2UuZGYkc2FyZWFlbj09IlNvbmdzaGFuIERpc3QuIl08LSJzc2giCmBgYAoKCmBgYHtyfQp1YmlrZS5kZgpgYGAKCiMjQ2hlY2sgcGxvdAojIyN1c2luZyBwbG90bWVhbgpgYGB7ciB3YXJuaW5nPUZBTFNFfQpwbG90bWVhbnMoc2F0IH4gc2FyZWFlbiwgbWFpbj0iSGV0ZXJvZ2VpbmVpdHkgYWNyb3NzIGFyZWEiLCBkYXRhPXViaWtlLmRmKQpwbG90bWVhbnMoc2F0IH4gc25vLCBtYWluPSJIZXRlcm9nZWluZWl0eSBhY3Jvc3Mgc25vIiwgZGF0YT11YmlrZS5kZikKYGBgCiMjI0Ryb3Agb3V0IHJvdyB2YWx1ZT09MApgYGB7ciB3YXJuaW5nPUZBTFNFfQojZHJvcCA2LDgyLDEzOSwyNTIKdWJpa2UuZGY8LXViaWtlLmRmWyF1YmlrZS5kZiRzbm8gJWluJSBjKDYsODIsMTM5LDI1MiksXQpgYGAKCiMjIyByZXZpZXcgcGxvdG1lYW5zCmBgYHtyIHdhcm5pbmc9RkFMU0V9CnBsb3RtZWFucyhzYXQgfiBzbm8sIG1haW49IkhldGVyb2dlaW5laXR5IGFjcm9zcyBuby4iLCBkYXRhPXViaWtlLmRmKQpwbG90bWVhbnMoc2F0IH4gc2FyZWFlbiwgbWFpbj0iSGV0ZXJvZ2VpbmVpdHkgYWNyb3NzIGFyZWEiLCBkYXRhPXViaWtlLmRmKQpwbG90bWVhbnMoc2F0IH4gZG93LCBtYWluPSJIZXRlcm9nZWluZWl0eSBhY3Jvc3MgZGF5IG9mIHdlZWsiLCBkYXRhPXViaWtlLmRmKQpgYGAKCgojI0NoZWNrIHNwZWNpZmljIGJpa2Ugc3RhdGlvbgojIyMgc3RhdGlvbiBuby4xCmBgYHtyfQpzdGExPC11YmlrZS5kZlt1YmlrZS5kZiRzbm89PTEsXQpwbG90KHN0YTEkVGltZSxzdGExJHNhdCkKYGBgCgojIyMjIGhpZ2hsaWdodCBGcmlkYXkKYGBge3IgZWNobz1GQUxTRX0Kc3RhMSQiZnJpIj0gaWZlbHNlKHN0YTEkZG93PT0iRnJpZGF5IiwxLDApCgpzdGFydGRhdGU8LWFzLlBPU0lYY3QoIjIwMTctMTEtMTUgR01UIikKZW5kZGF0ZTwtYXMuUE9TSVhjdCgiMjAxNy0xMS0yOCBHTVQiKQpjaGVjazwtc3RhMVtzdGExJFRpbWUgJWJldHdlZW4lIGMoc3RhcnRkYXRlLCBlbmRkYXRlKSxdCgppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJGZyaSkpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtZ2dwbG90KGRhdGE9Y2hlY2ssIGFlcyhUaW1lLCBzYXQseG1pbj1zdGFydGRhdGUsIHhtYXg9ZW5kZGF0ZSksIG5hLnJtID0gVFJVRSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ2VvbV9saW5lKGx0eT0yLCBjb2xvcj0ic3RlZWxibHVlIiwgbHdkPTEpICsKICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxzaXplID0gMSkgKwogIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0iZ3JlZW4iLCBhbHBoYT0wLjMpCnAKYGBgCiMjIyMgaGlnaGxpZ2h0IG1vcm5pbmcKYGBge3IgZWNobz1GQUxTRX0Kc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCgpwCmBgYAojIyNzdGF0aW9uIG5vLjE6QSBjbG9zZXIgbG9vawojIyMjIGhpZ2hsaWdodCBGcmlkYXkKYGBge3IgZWNobz1GQUxTRX0Kc3RhMSQiZnJpIj0gaWZlbHNlKHN0YTEkZG93PT0iRnJpZGF5IiwxLDApCgpzdGFydGRhdGU8LWFzLlBPU0lYY3QoIjIwMTctMTEtMjIgR01UIikKZW5kZGF0ZTwtYXMuUE9TSVhjdCgiMjAxNy0xMS0yNSBHTVQiKQpjaGVjazwtc3RhMVtzdGExJFRpbWUgJWJldHdlZW4lIGMoc3RhcnRkYXRlLCBlbmRkYXRlKSxdCgppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJGZyaSkpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtZ2dwbG90KGRhdGE9Y2hlY2ssIGFlcyhUaW1lLCBzYXQseG1pbj1zdGFydGRhdGUsIHhtYXg9ZW5kZGF0ZSksIG5hLnJtID0gVFJVRSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ2VvbV9saW5lKGx0eT0yLCBjb2xvcj0ic3RlZWxibHVlIiwgbHdkPTEpICsKICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxzaXplID0gMSkgKwogIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0iZ3JlZW4iLCBhbHBoYT0wLjMpCnAKYGBgCgojIyMjIGhpZ2hsaWdodCBtb3JuaW5nCmBgYHtyIGVjaG89RkFMU0V9CnN0YTEkIk1vciI9IGlmZWxzZShzdGExJGhvdXIgJWluJSBjKDcsOCw5LDEwKSwxLDApCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRNb3IpKSkKc3RhcnQgPC0gY2hlY2skVGltZVtpbmRzID09IDFdCmVuZCA8LSBjaGVjayRUaW1lW2luZHMgPT0gLTFdCmlmIChsZW5ndGgoc3RhcnQpID4gbGVuZ3RoKGVuZCkpIAp7CiAgZW5kIDwtIGMoZW5kLCB0YWlsKGNoZWNrJFRpbWUsIDEpKQp9CnJlY3RzIDwtIGRhdGEuZnJhbWUoc3RhcnQ9YXMuUE9TSVhjdChzdGFydCksIGVuZD1hcy5QT1NJWGN0KGVuZCksIGdyb3VwPXNlcV9hbG9uZyhzdGFydCkpCnA8LXArICBnZW9tX3JlY3QoZGF0YT1yZWN0cywgaW5oZXJpdC5hZXM9RkFMU0UsIGFlcyh4bWluPXN0YXJ0LCB4bWF4PWVuZCwgeW1pbj0tSW5mLHltYXg9SW5mLCBncm91cD1ncm91cCksIGNvbG9yPSJ0cmFuc3BhcmVudCIsIGZpbGw9Im9yYW5nZSIsIGFscGhhPTAuMykgIAoKcApgYGAKCiMjIyBzdGF0aW9uIG5vLjIyCmBgYHtyfQpzdGExPC11YmlrZS5kZlt1YmlrZS5kZiRzbm89PTIyLF0KcGxvdChzdGExJFRpbWUsc3RhMSRzYXQpCmBgYApgYGB7ciBlY2hvPUZBTFNFfQpzdGExJCJmcmkiPSBpZmVsc2Uoc3RhMSRkb3c9PSJGcmlkYXkiLDEsMCkKCnN0YXJ0ZGF0ZTwtYXMuUE9TSVhjdCgiMjAxNy0xMS0yMiBHTVQiKQplbmRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTI1IEdNVCIpCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KCmluZHMgPC0gZGlmZihuYS5vbWl0KGMoMCwgY2hlY2skZnJpKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1nZ3Bsb3QoZGF0YT1jaGVjaywgYWVzKFRpbWUsIHNhdCx4bWluPXN0YXJ0ZGF0ZSwgeG1heD1lbmRkYXRlKSwgbmEucm0gPSBUUlVFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2xpbmUobHR5PTIsIGNvbG9yPSJzdGVlbGJsdWUiLCBsd2Q9MSkgKwogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLHNpemUgPSAxKSArCiAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJncmVlbiIsIGFscGhhPTAuMykKcApgYGAKYGBge3IgZWNobz1GQUxTRX0Kc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCgpwCmBgYAojIERhdGE6V2VhdGhlcgojI+iugOWFpeWkqeawo+izh+ioigpgYGB7ciByZXN1bHRzPUZBTFNFfQpzdGF0aW9uPC1jKCJ0YWlwZWkiLCJ0aWFubXUiLCJuZWlodSIsInhpbnlpIiwic29uZ3NoYW4iLCJnb25nZ3VhbiIsImRhemhpIiwid2Vuc2hhbiIsIm5hbmdhbmciKQprPTAKZm9yKGkgaW4gMTpsZW5ndGgoc3RhdGlvbikpCnsKICB3aGVhV0Q8LSIvVXNlcnMvbWF4Y2hlbi9Hb29nbGUgRHJpdmUvQ291cnNlL1dvcmtpbmdfb24v5YWn55Sf5oCn5aCx5ZGKL3dlYXRoZXIvIgogIHdoZWFXRDwtcGFzdGUod2hlYVdELHN0YXRpb25baV0sc2VwID0gIiIsIGNvbGxhcHNlID0gTlVMTCkKICBzZXR3ZCh3aGVhV0QpCiAgZmlsZXMgPSBsaXN0LmZpbGVzKHBhdHRlcm49IiouY3N2IikKICB0ZW1wID0gZG8uY2FsbChyYmluZCwgbGFwcGx5KGZpbGVzLGZ1bmN0aW9uKHgpewogICAgcmVhZC5jc3YoeCxmaWxlRW5jb2RpbmcgPSAiVVRGLTgiLCBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgfSkpCiAgaWYoaz09MCkKICB7CiAgICB3ZWF0aGVyPC10ZW1wCiAgICBrPTEKICB9CiAgZWxzZQogIHsKICAgIHdlYXRoZXI8LXJiaW5kKHdlYXRoZXIsdGVtcCkKICB9Cn0KYGBgCiMjI+mHjeaWsOWRveWQjQpgYGB7cn0KY29sbmFtZXMod2VhdGhlcikgPC1jKCJPYnN0aW1lIiwiU3RuUHJlIiwiU2VhUHJlIiwidGVtcF9ob3VyIiwiVGRkZXdwb2ludCIsImh1bWlkaXR5Iiwid2luZF9zcGVlZCIsICJ3aW5kX2RlZ3JlZSIsIldTR3VzdCIsIldER3VzdCIsICJwcmVjcCIsInByZWNwSG91ciIsInN1bnNoaW5lIiwiR2xvYnJhZCIsInZpc2IiLCJ5ZWFyIiwibW9udGgiLCJkYXkiLCJob3VyIiwiVGltZSIsInN0YXRpb24iKQoKYGBgCgpgYGB7ciByZXN1bHRzID0gImhpZGUifQp3ZWF0aGVyJFg8LU5VTEwKd2VhdGhlciR0ZW1wX2hvdXI8LWFzLm51bWVyaWMod2VhdGhlciR0ZW1wX2hvdXIpCndlYXRoZXIkaHVtaWRpdHk8LWFzLm51bWVyaWMod2VhdGhlciRodW1pZGl0eSkKd2VhdGhlciR3aW5kX3NwZWVkPC1hcy5udW1lcmljKHdlYXRoZXIkd2luZF9zcGVlZCkKd2VhdGhlciRwcmVjcDwtYXMubnVtZXJpYyh3ZWF0aGVyJHByZWNwKQpgYGAKIyMj5ZCI5L215aSp5rCj6LOH5paZCmBgYHtyfQpjb2xuYW1lcyh1YmlrZS5kZilbMThdIDwtICJkYXkiCnRvdGFsIDwtIG1lcmdlKHViaWtlLmRmLHdlYXRoZXIsIGJ5ID0gYygiZGF5IiwiaG91ciIsInN0YXRpb24iKSAsIGFsbC54PVRSVUUgKQpgYGAKCiMjI+aomeekuuS4i+mbqApgYGB7cn0KdG90YWxbInJhaW4iXTwtMAp0b3RhbCRyYWluW3RvdGFsJHByZWNwPjBdPC0xCmNvbG5hbWVzKHRvdGFsKVsxOF0gPC0gIlRpbWUiCmBgYApgYGB7cn0KdG90YWwKYGBgCmBgYHtyfQpzdGExPC10b3RhbFt0b3RhbCRzbm89PTIyLF0KYGBgCiMjI+WKoOWFpeS4i+mbqOWNgOmWkwpgYGB7ciBlY2hvPUZBTFNFfQpzdGExJCJmcmkiPSBpZmVsc2Uoc3RhMSRkb3c9PSJGcmlkYXkiLDEsMCkKCnN0YXJ0ZGF0ZTwtYXMuUE9TSVhjdCgiMjAxNy0xMS0yMiBHTVQiKQplbmRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTI1IEdNVCIpCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KCmluZHMgPC0gZGlmZihuYS5vbWl0KGMoMCwgY2hlY2skZnJpKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1nZ3Bsb3QoZGF0YT1jaGVjaywgYWVzKFRpbWUsIHNhdCx4bWluPXN0YXJ0ZGF0ZSwgeG1heD1lbmRkYXRlKSwgbmEucm0gPSBUUlVFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2xpbmUobHR5PTIsIGNvbG9yPSJzdGVlbGJsdWUiLCBsd2Q9MSkgKwogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLHNpemUgPSAxKSArCiAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJncmVlbiIsIGFscGhhPTAuMykKIyMjIyMKc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCiMjIyMjCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRyYWluKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1wKyAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJyZWQiLCBhbHBoYT0wLjMpICAKcApgYGAKCiNEaWZmZXJlbmNlCiMjIENoZWNrIHN0YXRpb24gbm8uMQpgYGB7cn0Kc3RhMTwtdG90YWxbdG90YWwkc25vPT0xLF0KYGBgCiMjIyBTb3J0IGJ5IHRpbWUKYGBge3J9CnN0YTE8LXN0YTFbb3JkZXIoc3RhMSRUaW1lICwgZGVjcmVhc2luZyA9IEZBTFNFICksXQpgYGAKIyMjIENhbGN1bGF0ZSBkaWZmZXJlbmNlCmBgYHtyfQpzdGExJCJkaWZmIjwtMApmb3IoaSBpbiAyOm5yb3coc3RhMSkpCnsKICBzdGExJGRpZmZbaV08LWFicyhzdGExJHNiaVtpXS1zdGExJHNiaVtpLTFdKQp9CmBgYAojIyMgQ2hlY2sgcGxvdApgYGB7ciBlY2hvPUZBTFNFfQpzdGExJCJmcmkiPSBpZmVsc2Uoc3RhMSRkb3c9PSJGcmlkYXkiLDEsMCkKCnN0YXJ0ZGF0ZTwtYXMuUE9TSVhjdCgiMjAxNy0xMS0yMiBHTVQiKQplbmRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTI1IEdNVCIpCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KCmluZHMgPC0gZGlmZihuYS5vbWl0KGMoMCwgY2hlY2skZnJpKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1nZ3Bsb3QoZGF0YT1jaGVjaywgYWVzKFRpbWUsIGRpZmYseG1pbj1zdGFydGRhdGUsIHhtYXg9ZW5kZGF0ZSksIG5hLnJtID0gVFJVRSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgZ2VvbV9saW5lKGx0eT0yLCBjb2xvcj0ic3RlZWxibHVlIiwgbHdkPTEpICsKICBnZW9tX3BvaW50KG5hLnJtID0gVFJVRSxzaXplID0gMSkgKwogIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0iZ3JlZW4iLCBhbHBoYT0wLjMpCiMjIyMjCnN0YTEkIk1vciI9IGlmZWxzZShzdGExJGhvdXIgJWluJSBjKDcsOCw5LDEwKSwxLDApCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRNb3IpKSkKc3RhcnQgPC0gY2hlY2skVGltZVtpbmRzID09IDFdCmVuZCA8LSBjaGVjayRUaW1lW2luZHMgPT0gLTFdCmlmIChsZW5ndGgoc3RhcnQpID4gbGVuZ3RoKGVuZCkpIAp7CiAgZW5kIDwtIGMoZW5kLCB0YWlsKGNoZWNrJFRpbWUsIDEpKQp9CnJlY3RzIDwtIGRhdGEuZnJhbWUoc3RhcnQ9YXMuUE9TSVhjdChzdGFydCksIGVuZD1hcy5QT1NJWGN0KGVuZCksIGdyb3VwPXNlcV9hbG9uZyhzdGFydCkpCnA8LXArICBnZW9tX3JlY3QoZGF0YT1yZWN0cywgaW5oZXJpdC5hZXM9RkFMU0UsIGFlcyh4bWluPXN0YXJ0LCB4bWF4PWVuZCwgeW1pbj0tSW5mLHltYXg9SW5mLCBncm91cD1ncm91cCksIGNvbG9yPSJ0cmFuc3BhcmVudCIsIGZpbGw9Im9yYW5nZSIsIGFscGhhPTAuMykgIAojIyMjIwpjaGVjazwtc3RhMVtzdGExJFRpbWUgJWJldHdlZW4lIGMoc3RhcnRkYXRlLCBlbmRkYXRlKSxdCmluZHMgPC0gZGlmZihuYS5vbWl0KGMoMCwgY2hlY2skcmFpbikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0icmVkIiwgYWxwaGE9MC4zKSAgCnAKYGBgCiMjIENoZWNrIHN0YXRpb24gbm8uMjIKYGBge3IgZWNobz1GQUxTRX0Kc3RhMTwtdG90YWxbdG90YWwkc25vPT0yMixdCgpzdGExPC1zdGExW29yZGVyKHN0YTEkVGltZSAsIGRlY3JlYXNpbmcgPSBGQUxTRSApLF0KCnN0YTEkImRpZmYiPC0wCmZvcihpIGluIDI6bnJvdyhzdGExKSkKewogIHN0YTEkZGlmZltpXTwtYWJzKHN0YTEkc2JpW2ldLXN0YTEkc2JpW2ktMV0pCn0KCnN0YTEkImZyaSI9IGlmZWxzZShzdGExJGRvdz09IkZyaWRheSIsMSwwKQoKc3RhcnRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTIyIEdNVCIpCmVuZGRhdGU8LWFzLlBPU0lYY3QoIjIwMTctMTEtMjUgR01UIikKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQoKaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRmcmkpKSkKc3RhcnQgPC0gY2hlY2skVGltZVtpbmRzID09IDFdCmVuZCA8LSBjaGVjayRUaW1lW2luZHMgPT0gLTFdCmlmIChsZW5ndGgoc3RhcnQpID4gbGVuZ3RoKGVuZCkpIAp7CiAgZW5kIDwtIGMoZW5kLCB0YWlsKGNoZWNrJFRpbWUsIDEpKQp9CnJlY3RzIDwtIGRhdGEuZnJhbWUoc3RhcnQ9YXMuUE9TSVhjdChzdGFydCksIGVuZD1hcy5QT1NJWGN0KGVuZCksIGdyb3VwPXNlcV9hbG9uZyhzdGFydCkpCnA8LWdncGxvdChkYXRhPWNoZWNrLCBhZXMoVGltZSwgZGlmZix4bWluPXN0YXJ0ZGF0ZSwgeG1heD1lbmRkYXRlKSwgbmEucm0gPSBUUlVFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2xpbmUobHR5PTIsIGNvbG9yPSJzdGVlbGJsdWUiLCBsd2Q9MSkgKwogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLHNpemUgPSAxKSArCiAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJncmVlbiIsIGFscGhhPTAuMykKIyMjIyMKc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCiMjIyMjCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRyYWluKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1wKyAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJyZWQiLCBhbHBoYT0wLjMpICAKcApgYGAKIyMgQ2hlY2sgc3RhdGlvbiBuby44NyDlpKflrokKYGBge3IgZWNobz1GQUxTRX0Kc3RhMTwtdG90YWxbdG90YWwkc25vPT04NyxdCgpzdGExPC1zdGExW29yZGVyKHN0YTEkVGltZSAsIGRlY3JlYXNpbmcgPSBGQUxTRSApLF0KCnN0YTEkImRpZmYiPC0wCmZvcihpIGluIDI6bnJvdyhzdGExKSkKewogIHN0YTEkZGlmZltpXTwtYWJzKHN0YTEkc2JpW2ldLXN0YTEkc2JpW2ktMV0pCn0KCnN0YTEkImZyaSI9IGlmZWxzZShzdGExJGRvdz09IkZyaWRheSIsMSwwKQoKc3RhcnRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTIyIEdNVCIpCmVuZGRhdGU8LWFzLlBPU0lYY3QoIjIwMTctMTEtMjUgR01UIikKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQoKaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRmcmkpKSkKc3RhcnQgPC0gY2hlY2skVGltZVtpbmRzID09IDFdCmVuZCA8LSBjaGVjayRUaW1lW2luZHMgPT0gLTFdCmlmIChsZW5ndGgoc3RhcnQpID4gbGVuZ3RoKGVuZCkpIAp7CiAgZW5kIDwtIGMoZW5kLCB0YWlsKGNoZWNrJFRpbWUsIDEpKQp9CnJlY3RzIDwtIGRhdGEuZnJhbWUoc3RhcnQ9YXMuUE9TSVhjdChzdGFydCksIGVuZD1hcy5QT1NJWGN0KGVuZCksIGdyb3VwPXNlcV9hbG9uZyhzdGFydCkpCnA8LWdncGxvdChkYXRhPWNoZWNrLCBhZXMoVGltZSwgZGlmZix4bWluPXN0YXJ0ZGF0ZSwgeG1heD1lbmRkYXRlKSwgbmEucm0gPSBUUlVFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2xpbmUobHR5PTIsIGNvbG9yPSJzdGVlbGJsdWUiLCBsd2Q9MSkgKwogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLHNpemUgPSAxKSArCiAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJncmVlbiIsIGFscGhhPTAuMykKIyMjIyMKc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCiMjIyMjCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRyYWluKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1wKyAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJyZWQiLCBhbHBoYT0wLjMpICAKcApgYGAKIyMgQ2hlY2sgc3RhdGlvbiBuby40NSDlhazppKgKYGBge3IgZWNobz1GQUxTRX0Kc3RhMTwtdG90YWxbdG90YWwkc25vPT00NSxdCgpzdGExPC1zdGExW29yZGVyKHN0YTEkVGltZSAsIGRlY3JlYXNpbmcgPSBGQUxTRSApLF0KCnN0YTEkImRpZmYiPC0wCmZvcihpIGluIDI6bnJvdyhzdGExKSkKewogIHN0YTEkZGlmZltpXTwtYWJzKHN0YTEkc2JpW2ldLXN0YTEkc2JpW2ktMV0pCn0KCnN0YTEkImZyaSI9IGlmZWxzZShzdGExJGRvdz09IkZyaWRheSIsMSwwKQoKc3RhcnRkYXRlPC1hcy5QT1NJWGN0KCIyMDE3LTExLTIyIEdNVCIpCmVuZGRhdGU8LWFzLlBPU0lYY3QoIjIwMTctMTEtMjUgR01UIikKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQoKaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRmcmkpKSkKc3RhcnQgPC0gY2hlY2skVGltZVtpbmRzID09IDFdCmVuZCA8LSBjaGVjayRUaW1lW2luZHMgPT0gLTFdCmlmIChsZW5ndGgoc3RhcnQpID4gbGVuZ3RoKGVuZCkpIAp7CiAgZW5kIDwtIGMoZW5kLCB0YWlsKGNoZWNrJFRpbWUsIDEpKQp9CnJlY3RzIDwtIGRhdGEuZnJhbWUoc3RhcnQ9YXMuUE9TSVhjdChzdGFydCksIGVuZD1hcy5QT1NJWGN0KGVuZCksIGdyb3VwPXNlcV9hbG9uZyhzdGFydCkpCnA8LWdncGxvdChkYXRhPWNoZWNrLCBhZXMoVGltZSwgZGlmZix4bWluPXN0YXJ0ZGF0ZSwgeG1heD1lbmRkYXRlKSwgbmEucm0gPSBUUlVFKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICBnZW9tX2xpbmUobHR5PTIsIGNvbG9yPSJzdGVlbGJsdWUiLCBsd2Q9MSkgKwogIGdlb21fcG9pbnQobmEucm0gPSBUUlVFLHNpemUgPSAxKSArCiAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJncmVlbiIsIGFscGhhPTAuMykKIyMjIyMKc3RhMSQiTW9yIj0gaWZlbHNlKHN0YTEkaG91ciAlaW4lIGMoNyw4LDksMTApLDEsMCkKY2hlY2s8LXN0YTFbc3RhMSRUaW1lICViZXR3ZWVuJSBjKHN0YXJ0ZGF0ZSwgZW5kZGF0ZSksXQppbmRzIDwtIGRpZmYobmEub21pdChjKDAsIGNoZWNrJE1vcikpKQpzdGFydCA8LSBjaGVjayRUaW1lW2luZHMgPT0gMV0KZW5kIDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAtMV0KaWYgKGxlbmd0aChzdGFydCkgPiBsZW5ndGgoZW5kKSkgCnsKICBlbmQgPC0gYyhlbmQsIHRhaWwoY2hlY2skVGltZSwgMSkpCn0KcmVjdHMgPC0gZGF0YS5mcmFtZShzdGFydD1hcy5QT1NJWGN0KHN0YXJ0KSwgZW5kPWFzLlBPU0lYY3QoZW5kKSwgZ3JvdXA9c2VxX2Fsb25nKHN0YXJ0KSkKcDwtcCsgIGdlb21fcmVjdChkYXRhPXJlY3RzLCBpbmhlcml0LmFlcz1GQUxTRSwgYWVzKHhtaW49c3RhcnQsIHhtYXg9ZW5kLCB5bWluPS1JbmYseW1heD1JbmYsIGdyb3VwPWdyb3VwKSwgY29sb3I9InRyYW5zcGFyZW50IiwgZmlsbD0ib3JhbmdlIiwgYWxwaGE9MC4zKSAgCiMjIyMjCmNoZWNrPC1zdGExW3N0YTEkVGltZSAlYmV0d2VlbiUgYyhzdGFydGRhdGUsIGVuZGRhdGUpLF0KaW5kcyA8LSBkaWZmKG5hLm9taXQoYygwLCBjaGVjayRyYWluKSkpCnN0YXJ0IDwtIGNoZWNrJFRpbWVbaW5kcyA9PSAxXQplbmQgPC0gY2hlY2skVGltZVtpbmRzID09IC0xXQppZiAobGVuZ3RoKHN0YXJ0KSA+IGxlbmd0aChlbmQpKSAKewogIGVuZCA8LSBjKGVuZCwgdGFpbChjaGVjayRUaW1lLCAxKSkKfQpyZWN0cyA8LSBkYXRhLmZyYW1lKHN0YXJ0PWFzLlBPU0lYY3Qoc3RhcnQpLCBlbmQ9YXMuUE9TSVhjdChlbmQpLCBncm91cD1zZXFfYWxvbmcoc3RhcnQpKQpwPC1wKyAgZ2VvbV9yZWN0KGRhdGE9cmVjdHMsIGluaGVyaXQuYWVzPUZBTFNFLCBhZXMoeG1pbj1zdGFydCwgeG1heD1lbmQsIHltaW49LUluZix5bWF4PUluZiwgZ3JvdXA9Z3JvdXApLCBjb2xvcj0idHJhbnNwYXJlbnQiLCBmaWxsPSJyZWQiLCBhbHBoYT0wLjMpICAKcApgYGA=